package v1

import (
	"gin-blog/model"
	"gin-blog/utils/msg"
	"gin-blog/utils/validator"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

// AddUser 添加用户
func AddUser(c *gin.Context) {
	var user model.User
	var result string
	var code int
	// 为user进行数据绑定
	_ = c.ShouldBindJSON(&user)
	// 数据校验，与User字段设置的validator有关
	result, code = validator.Validator(&user)
	if code != msg.SUCCESS {
		c.JSON(http.StatusOK, msg.R(code, "result", result))
		return
	}
	// 用户名检查
	code = model.CheckUser(&user)
	if code == msg.SUCCESS {
		model.AddUser(&user)
	}
	// 传出结果
	c.JSON(http.StatusOK, msg.R(code, "user", user))
}

// GetUserByUsername 根据用户名查询用户
func GetUserByUsername(c *gin.Context) {

}

// GetUserById 根据用户id查询单个用户
func GetUserById(c *gin.Context) {

}

// GetUsers 查询用户列表
func GetUsers(c *gin.Context) {
	pageSize, errSize := strconv.Atoi(c.Query("pagesize"))
	pageNum, errNum := strconv.Atoi(c.Query("pagenum"))
	// gorm中存在方法，如果db.Limit中值为-1，则表示不需要Limit
	if pageSize == 0 {
		pageSize = -1
	}
	// gorm中存在方法，如果db.Offset中值为-1，则表示不需要Offset
	if pageNum == 0 {
		pageNum = -1
	}

	var users []model.User
	var count int
	code := msg.SUCCESS

	// 错误处理，防止输入的大小和页码不是数字
	if errSize != nil {
		code = msg.ERROR_USER_LIST_SIZE
	} else if errNum != nil {
		code = msg.ERROR_USER_LIST_NUM
	} else {
		users, count = model.GetUsers(pageSize, pageNum)
	}
	var dataMap = make(map[string]interface{})
	dataMap["users"] = users
	dataMap["count"] = count
	c.JSON(http.StatusOK, msg.RS(code, dataMap))
}

// EditUser 修改用户
func EditUser(c *gin.Context) {
	var user model.User
	err := c.ShouldBindJSON(&user)

	code := model.CheckUser(&user)
	if code == msg.SUCCESS {
		if err != nil {
			code = msg.ERROR_REQUEST_DATA
		} else {
			code = model.EditUser(&user)
		}
	}

	c.JSON(http.StatusOK, msg.R(code, "user", user))
}

// DeleteUser 删除用户，软删除，不会真正删除，会在delete_at字段中插入删除时间，查询的时候也不会将这条数据查出来
func DeleteUser(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	code := model.DeleteUser(id)
	c.JSON(http.StatusOK, msg.R(code, "id", id))
}
